package Recolector;

import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Clase encargada de recorrer un índice del foro (forumdisplay.php?f=475) dado
 * y de ir llenando la cola con las URLs de los temas que encuentra. Recorre todas
 * las páginas del índice que encuentra (no sólo la primera).
 * @author Mikel&Igor
 */
public class RecolectorEnlaces extends Thread {
    // La URL del índice del foro que estamos procesando
    private URL indice;

    /**
     * No se usa
     * @deprecated 
     */
    public RecolectorEnlaces() {
    }

    /**
     * Constructor preferido
     * @param indice La URL del índice del foro que estamos procesando
     */
    public RecolectorEnlaces(URL indice) {
        this.indice = indice;
    }

    /**
     * Método de la clase Thread que extendemos para que el código pueda ejecutarse
     * en hilos.
     */
    @Override
    public void run() {
        URLBrowser ub = new URLBrowser(indice);
        try {
            // Obtener el número de páginas que hay en este índice
            // (a partir del html de la primera página)
            String html = ub.recolectar();
            int numPag = obtenerNumPag(html);

            // Para cada página del índice
            for (int i = 1 ; i <= numPag ; ++i) {
                if ( i != 1 ) { // No queremos recolectar si i==1 porque
                                // ya tenemos la página descargada.

                    // Obtener la nueva URL de la siguiente página
                    URL newURL = new URL("" + indice + "&order=desc&page=" + i);
                    ub.setUrl(newURL);
                    //Recolectar el html de dicha página
                    html = ub.recolectar();
                }

                System.out.println("> Indice: " + indice + "&order=desc&page=" + i);

                // Para encontrar un nuevo tema dentro del índice, nos basamos en
                // estas características, los temas:
                //   * tienen 'showthread.php'
                //   * luego cualquier cadena (.*)
                //   * luego 't=número'
                //   * y al final ' id=thread_title_'

                // Para ello creamos una expresión regular y la compilamos
                Pattern pat = Pattern.compile("showthread\\.php(.*)(t=[0123456789]+)\" id=\"thread_title_");
                // Desde esa Pattern obtenemos el objeto que nos va a permitir encontrar
                // las coincidencias de la expresión en un String (en este caso, el html del índice)
                Matcher mat = pat.matcher(html);

                // Mientas sigamos encontrando expresiones que casen
                while (mat.find()) {
                    String s = mat.group(2); //el grupo 2 es el número (t=[0123456789]+)
                    ColaURL.meter(new URL("http://www.vagos.es/showthread.php?"+s));
                }
            }

        } catch (Exception ex) {
            System.err.println("Fallo al conectar: " + ex.getMessage());
            //Logger.getLogger(RecolectorEnlaces.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Función privada que nos busca el número de páginas que tiene un índice
     * @param html El código html de la primera página
     * @return El número de la última página del índice
     * @throws Exception Se lanza si falla al encontrar algún número, o el formato
     * es incorrecto
     */
    private int obtenerNumPag(String html) throws Exception {
        int res = 0;
        // Obtener el número identificador del foro de la dirección del indice
        Pattern pat = Pattern.compile("forumdisplay\\.php\\?f=([0123456789]+)");
        Matcher mat = pat.matcher(indice.toString());
        if (!mat.find())
            throw new Exception("Error en obtenerNumPag, no es un foro de Vagos");
        String numeroForo = mat.group(1);

        // Buscaremos todas las cadenas de la forma forumdisplay.php...f=XXXX...page=YYYYYYY
        pat = Pattern.compile("forumdisplay\\.php\\?.*f=" + numeroForo + ".*page=([0123456789]+)");
        mat = pat.matcher(html);
        String aux = null;
        while ( mat.find() ){
            aux = mat.group(1);
        } //Buscar el último
        // El número de páginas está siempre el último.
        res = Integer.parseInt(aux);
        return res;
    }
}
